<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <script>
    /* 
    需求:
    1. 输出arr中所有的值和对应的下标
    2. 得到arr中第一个3的下标和最后一个3的下标
    3. 判断arr中有没有奇数的元素
    4. 判断arr中是否全部元素都是奇数
    5. 得到一个由arr中值大于5的元素组成的数组
    6. 得到一个比arr中每个元素都大10的数组
    7. 得到arr中所有奇数的和
    8. 得到arr中所有奇数加10后组成的数组
    */
   /* 
    - Array.prototype.forEach(function(item, index){}) : 遍历数组
    - Array.prototype.indexOf(value) : 得到值在数组中的第一个下标
    - Array.prototype.lastIndexOf(value) : 得到值在数组中的最后一个下标
    - Array.prototype.map(function(item, index){}) : 遍历数组返回一个新的数组
    - Array.prototype.filter(function(item, index){}) : 遍历过滤出一个新的子数组
    - Array.prototype.some(function(item, index){}): 判断是否有一个元素满足条件
    - Array.prototype.every(function(item, index){}): 判断是否所有元素都满足条件
    - Array.prototype.reduce(function(preTotal, item, index){}) : 遍历返回一个累加的结果
   */
    const arr = [6, 3, 5, 7, 3, 8]

    // 1. 输出arr中所有的值和对应的下标
    // arr.forEach(function (item, index) {
    //   console.log(item, index)
    // })

    // 2. 得到arr中第一个3的下标和最后一个3的下标
    console.log(arr.indexOf(3), arr.lastIndexOf(3)) // 1 4

    // 3. 判断arr中有没有奇数的元素
    console.log(arr.some(function (item) {
      return item%2 === 1
    }))

    // 4. 判断arr中是否全部元素都是奇数
    console.log(arr.every(function (item) {
      return item%2 === 1
    }))


    // 5. 得到一个由arr中值大于5的元素组成的数组
    console.log(arr.filter(function (item) {
      return item>5
    }))

    // 6. 得到一个比arr中每个元素都大10的数组
    console.log(arr.map(function (item) {
      return item + 10
    }))

    // 7. 得到arr中所有奇数的和
    console.log(arr.reduce(function (preTotal, item) {
      return preTotal + (item % 2 ===1 ? item : 0)
    }, 0))

    // 8. 得到arr中所有奇数加10后组成的数组
    // map / filter 不可以
    console.log(arr.reduce(function (pre, item) { // [6, 3, 5, 7, 3, 8]
      if (item %2 === 1) {
        pre.push(item + 10)
      }
      return pre
    }, [])) // [13, 15, 17, 13]

    /* 
    对多维数组进行扁平化处理
      数组扁平化: [1, [2, [4, {}]]]  ==> [1, 2, 4, {}]
    */
    const arr2 = [1, [2, 4, [5, 6]]]
    /* 
    reduce() / concat()
    */
    function flat(arr) {
      return arr.reduce(function (pre, item) {

        // 如果item是一个一维数组没问题 [2, 4]
        // 如果item是一个二维数组有问题 [2, 4, [5, 6]] ==> [2, 4, 5, 6]
        // 如果item是一个数组, 且有元素是数组(item是一个多维数组) ==> 需要递归
        if (item instanceof Array 
          && item.some(function (cItem) {return Array.isArray(cItem)})) {
          return pre.concat(flat(item))
        } else {
          return pre.concat(item)
        }
      }, [])
    }

    flat([2, 4, [5, [6, 7]]])
    console.log(flat(arr2)) // [1, 2, 4, 5, 6]

  </script>
</body>
</html>